home *** CD-ROM | disk | FTP | other *** search
- /*
- File: ExcFocus.cpp
-
- Contains: Implementation of ODExclusiveFocusModule
-
- Owned by: Chris Linn
-
- Copyright: © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 6/21/96 CSL 1336201: Redundant transfer of focus sets
- done redundantly. 1342963:
- UnsetFocusOwnership doesn't call
- AdjustBorderShape.
- <24> 10/24/95 jpa 1293441: Eat exceptions in
- ResolveClipboardPromises
- <23> 10/8/95 TJ Fixes Recomended by Refball
- <22> 10/3/95 TJ Changes done by RefBall Team
- <21> 8/3/95 RR #1257260: Collapse B classes. Remove
- somInit methods. Don't call IsInitialized
- or SubclassResponsibility
- <20> 6/28/95 RR 1242642 BB Mostly ref counting. Release
- border shape
- <19> 6/25/95 TÇ 1242642 BB: Turn on ODDebug warning if
- refcount is wrong in
- ODRefCntObjectsomUninit.
- <18> 5/31/95 RR #1251403 Release after AcquirePart
- <17> 5/26/95 RR #1251403: Multithreading naming support
- <16> 5/17/95 RR #1250135/1250137/1250143 Getters increment
- refcount
- <15> 5/16/95 CC 1248632, 1244940: SetFocusOwnership:
- Externalize the current clipboard draft to
- force resolution of promises.
- <14> 5/10/95 JBS 1241913 ODPart::AdjustBorderShape is not
- called with null shape
- <13> 4/28/95 RR 1211085 Remove 5$ comments
- <12> 4/7/95 RR #1216618 Added SOM_TRY etc.
- <11> 4/6/95 RR #1220104 Use of ODObjectsAreEqual, #1211085
- Remove 5$ comments
- <10> 3/13/95 NP 1228158: Always call UseInputWindow when
- losing keystroke focus.
- <9> 3/7/95 RR #1220929 Added cache for selection focus
- <8> 3/1/95 NP 1187682: Call UseInputWindow when keystroke
- focus is lost.
- <7> 10/27/94 RR Call FocusLost in TransferFocus #1192168
- <6> 10/18/94 RR Added fSession. Detect change in selection
- focus. Override BRF, CRF, ARF.
- <5> 9/20/94 RR When assigning a new frame to fFrame, call
- Acquire on the new frame BEFORe
- calling Release on the old, in case they're
- the same frame.
- <4> 9/2/94 RR #1184275 Pass transferringFrame and
- newOwner to focusModule::TransferFocus
- <3> 8/24/94 RR Fixed ref counting in SetFocusOwnership
- <2> 8/23/94 RR Call Acquire and Release
- <1> 6/23/94 RR first checked in
-
- To Do:
- In Progress:
-
- */
-
-
- #define ODExclusiveFocusModule_Class_Source
- #define VARIABLE_MACROS
- #include <ExcFocus.xih>
-
- #ifndef _PLFMDEF_
- #include "PlfmDef.h"
- #endif
-
- #ifndef _TEMPOBJ_
- #include <TempObj.h>
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include "Frame.xh"
- #endif
-
- #ifndef SOM_Module_OpenDoc_Foci_defined
- #include "Foci.xh"
- #endif
-
- #ifndef _ODSESSN_
- #include "ODSessn.xh"
- #endif
-
- #ifndef SOM_ODPart_xh
- #include "Part.xh"
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include "Frame.xh"
- #endif
-
- #ifndef SOM_ODFrameFacetIterator_xh
- #include "FrFaItr.xh"
- #endif
-
- #ifndef SOM_ODArbitrator_xh
- #include <Arbitrat.xh>
- #endif
-
- #ifndef SOM_ODClipboard_xh
- #include <Clipbd.xh>
- #endif
-
- #ifndef __TEXTSERVICES__
- #include <TextServices.h> // Platform-dependent
- #endif
-
- //==============================================================================
- // Local function declarations
- //==============================================================================
-
- ODStatic void ResolveClipboardPromises(Environment *ev,
- ODFrame* selectionFrame,
- ODSession* session);
-
- //==============================================================================
- // Class ODExclusiveFocusModule
- //==============================================================================
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleInitExclusiveFocusModule(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODSession* session)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","InitExclusiveFocusModule");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fFrame = kODNULL;
- _fSession = kODNULL;
- _fSelectionFocus = 0;
- _fKeyFocus = 0;
- */
-
- somSelf->InitFocusModule(ev, session);
- _fSession = session;
- _fSelectionFocus = session->Tokenize(ev,kODSelectionFocus);
- _fKeyFocus = _fSession->Tokenize(ev, kODKeyFocus);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
-
- SOM_Scope void SOMLINK ODExclusiveFocusModulesomUninit(ODExclusiveFocusModule *somSelf)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","somUninit");
-
- parent_somUninit(somSelf);
- }
-
- SOM_Scope ODBoolean SOMLINK ODExclusiveFocusModuleIsFocusExclusive(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","IsFocusExclusive");
-
- ODUnused(focus);
- return kODTrue;
- }
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleSetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* frame)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","SetFocusOwnership");
-
- ODFacet* facet = kODNULL;
- ODFrameFacetIterator* facets = kODNULL;
-
- SOM_TRY
-
- if ( _fFrame )
- somSelf->UnsetFocusOwnership( ev, focus, _fFrame );
-
- if (frame)
- {
- if (focus == _fSelectionFocus)
- frame->DrawActiveBorder(ev); // Note: window->Update(ev);
-
- frame->Acquire(ev); // Do this last in case exceptions occur above
- }
- _fFrame = frame;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleUnsetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* frame)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","UnsetFocusOwnership");
-
- SOM_TRY
-
- if (ODObjectsAreEqual(ev, frame, _fFrame))
- {
- if (focus == _fSelectionFocus)
- {
- if (_fFrame)
- {
- _fFrame->InvalidateActiveBorder(ev);
-
- TempODFrame contFrame = _fFrame->AcquireContainingFrame(ev); // -- TÇ tempobj'd
- if ((ODFrame*) contFrame )
- {
- TempODPart contPart = contFrame->AcquirePart(ev); // -- TÇ tempobj'd
- ODFrameFacetIterator* facets = _fFrame->CreateFacetIterator(ev);
- ODFacet* facet = kODNULL;
- for ( facet = facets->First(ev);
- facets->IsNotComplete(ev);
- facet = facets->Next(ev) )
- {
- ODShape* border = contPart->AdjustBorderShape(ev, facet, kODNULL);
- ODReleaseObject(ev, border);
- }
- ODDeleteObject(facets);
- }
- }
-
- ResolveClipboardPromises(ev, _fFrame, _fSession);
- }
- else if (focus == _fKeyFocus)
- {
- const TSMDocumentID kAnyDoc = kODNULL;
-
- // Make sure to set this back to a safe state.
- UseInputWindow(kAnyDoc, kODTrue);
- }
-
-
- if (_fFrame)
- _fFrame->Release(ev);
- _fFrame = kODNULL;
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleTransferFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* transferringFrame,
- ODFrame* newOwner)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleTransferFocusOwnership");
-
- SOM_TRY
-
- TempODFrame oldOwner = somSelf->AcquireFocusOwner(ev, focus);
-
- // No need to do the transfer if the owner isn't changing
- if ( !ODObjectsAreEqual( ev, oldOwner, newOwner ))
- {
- somSelf->SetFocusOwnership(ev, focus, newOwner);
-
- if (oldOwner && (oldOwner != transferringFrame))
- {
- TempODPart part = oldOwner->AcquirePart(ev);
- part->FocusLost(ev, focus, oldOwner);
- }
- if (newOwner && (newOwner != transferringFrame))
- {
- TempODPart part = newOwner->AcquirePart(ev);
- part->FocusAcquired(ev, focus, newOwner);
- }
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope ODFrame* SOMLINK ODExclusiveFocusModuleAcquireFocusOwner(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","AcquireFocusOwner");
-
- ODUnused(focus);
- if (_fFrame) {
- SOM_TRY
- _fFrame->Acquire(ev);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
- return _fFrame;
- }
-
- SOM_Scope ODBoolean SOMLINK ODExclusiveFocusModuleBeginRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* requestingFrame)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleBeginRelinquishFocus");
-
- ODBoolean canRelinquish = kODTrue;
-
- SOM_TRY
-
- TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
-
- if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner, requestingFrame)))
- {
- TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
- if ((ODPart*)part)
- canRelinquish = part->BeginRelinquishFocus(ev, focus, currentOwner, requestingFrame);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return canRelinquish;
- }
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleCommitRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* requestingFrame)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleCommitRelinquishFocus");
-
- SOM_TRY
-
- TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
-
- if ((currentOwner) && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
- {
- TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
- if ((ODPart*)part)
- part->CommitRelinquishFocus(ev, focus, currentOwner, requestingFrame);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODExclusiveFocusModuleAbortRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* requestingFrame)
- {
- ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
- ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleAbortRelinquishFocus");
-
- SOM_TRY
-
- TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
- if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
- {
- TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
- if ((ODPart*)part)
- part->AbortRelinquishFocus(ev, focus, currentOwner,requestingFrame);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- ODStatic void ResolveClipboardPromises(Environment *ev,
- ODFrame* selectionFrame,
- ODSession* session)
- {
- ODArbitrator* arbitrator = session->GetArbitrator(ev);
-
- ODToken clipboardFocus = session->Tokenize(ev, kODClipboardFocus);
- TempODFrame clipOwner = arbitrator->AcquireFocusOwner(ev, clipboardFocus);
-
- if ( (clipOwner == selectionFrame) || arbitrator->RequestFocus(ev, clipboardFocus, selectionFrame) )
- {
- ODClipboard* clipboard = session->GetClipboard(ev);
- TRY{
- ODStorageUnit* su = clipboard->GetContentStorageUnit(ev);
- ODDraft* draft = su->GetDraft(ev);
- draft->Externalize(ev);
- }CATCH_ALL{
- WARN("Error %d externalizing clipboard",ErrorCode());
- // If this failed the Clipboard is probably hosed now.
- clipboard->DiscardClipboard(ev);
- }ENDTRY
-
- if ( clipOwner != selectionFrame )
- arbitrator->RelinquishFocus(ev, clipboardFocus, selectionFrame);
- }
- }
-